// MyProject.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
//公众号：程序员速成 ，内含一辈子都让你感激自己的优质视频教程，欢迎关注

#include <iostream>



//#include <boost/type_index.hpp>
using namespace std;
//#pragma warning(disable : 4996) 


namespace _nmsp1
{


}

int main() {
	_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);//程序退出时检测内存泄漏并显示到“输出”窗口

	//第一节 设计模式概述
	//（1）设计模式基本概念
	//《设计模式 可复用面向对象软件的基础》《Head First设计模式》《大话设计模式》
	//模式：指事物的标准样式 或者 理解成 针对特定问题的可重用解决方案。
	//设计模式：Design Pattern
	/*		设计模式，是一套被反复使用的代码设计经验的总结，是经过提炼的出色设计方法。
			设计模式，是程序员在长期的开发实践中总结出的一套提高开发效率与程序执行效率的编程方法。
			设计模式，代表了一些解决常见问题的通用做法，体现着人们尝试解决某些问题时的智慧。所以，它是一种强大的管理复杂度的工具。
			设计模式，是在特定问题发生时的可重用解决方案。
			一个设计模式用来描述几个模块或类对象之间关系、职责，以及它们之间如何进行分工与合作。一个甚至是几个设计模式共同配合来解决软件设计中面对的实际问题。
			设计模式在比编程语言惯用手法更高的层面来描述解决特定类型问题的途径。
			设计模式用来描述在软件系统中如何通过管理代码的相互依赖性来管理复杂性。
		*/
		//大型项目中，设计模式保证所设计的模块之间代码的灵活性和可复用性——都需要以增加代码的复杂性为代价。
		//(a)灵活性（课扩展性/低耦合性），人物形象方面的灵活性。
		//a.1）修改现有的部分内容不会影响到其他部分内容（影响面尽可能窄或者尽可能将需要修改的代码集中一起，不希望大范围修改代码）。
		//a.2）增加新内容的时候尽量少甚至不需要改动系统现有的内容。
		//(b)可复用性
		//《设计模式 可复用面向对象软件的基础》：可复用，面向对象
		//可复用：可以重复使用，可以到处用（可以被很多地方调用）；
		//面向对象：三大特性：封装，继承，多态——《C++新经典：对象模型》
			//C++支持的编程模型：面向过程，基于对象，面向对象（基于对象的编程模型融入继承性和多态性后形成的），泛型编程。
			//通常，设计模式指的是面向对象这种编程模型下的设计模式。组合使用各种设计模式来进行面向对象程序设计。

		//设计模式也被称为微架构（Micro-Architecture)，各种设计模式的组合运用可以生成各种新的架构。

		//（2）设计模式中的抽象思维
		// 耦合：两个模块相互依赖，修改其中一个模块，那么另外一个也要修改。模块之间相互影响的关系叫做两个模块之间存在耦合关系。
		// 解耦合：通过修改程序代码，切换两个模块之间的依赖关系，对任意一个模块的修改，不会 影响到另外一个模块，就叫做两个模块之间解耦合。
		//抽象思维强调对象的本质属性，主要应用于一些软件设计中的解耦合过程。
		//a)抽象思维的概念：能从事物中抽取出或者说提炼出一些本质的，共性的内容，把这些共性的内容组合到一起(封装）。
		//a.1)都是动物，要吃、喝——抽象出一个动物类，把吃、喝作为动物类的成员函数：
		//class Animal
		//{
		//public:
		//	void eat() //吃
		//	{
		//		//...
		//	}
		//	void drink() //喝
		//	{

		//	}
			//virtual void YT() = 0 //用途

		//};
		//a.2)各自都有不同的特点（不在抽象思维中，不多探讨）
		  //下面两种解决问题复杂性的方法可以借鉴：
		  //(1)分解法：把一个复杂的事物分解成若干个比较简单的事物。这样人们更容易理解。
		  //(2)抽象法：从每个简单的十五中，抽象出本质的内容封装起来：
		//学习设计模式的过程，是一个不断提高自己抽象思维能力的过程。

		//b)抽象思维的目的：
		//设计原则：减少代码的重复性，方便代码的扩展性（日后增加新动物品种）
		//做抽象的原则：把比较稳定的，不怎么变化的内容作为一个模块，单独定义出来。

		//c)抽象思维的检验：
		//如何检验某种抽象是否做的不错呢？
		 //c.1)项目需求如果发生更改，不更改现有的代码，通过增加新代码应对需求变更。
			//继承特性，一般用于表达两种意思：（1）抽象机制：抽取出本质的、共性的内容放到基类中；（2）可重用机制：基类中的一些内容，直接拿过来使用。
		//c.2)类中内容太多时，就要对类进行拆分，不要把毫不相关的内容写到一个类中。
		  //面向对象程序设计原则之一：单一职责原则——一个类只干好一件事，承担好一种责任，不然就会牵扯太多。


		//（3）学习设计模式普遍存在的问题
		//学习的共性问题：
		//a)听得懂但不会用
		 //学习设计模式的有效方法：忘记设计模式，先面对具体要解决的问题。 遇到难题->笨重的解决方案（效果不理想）->采用设计模式解决（效果理想）。
		//b)学完了之后到处滥用
		//设计模式一般用于解决 大型项目 设计时遇到的各种代码问题。 先有问题，才有设计模式。
		//设计项目时遵循的原则：
		  //b.1)不要过度设计； b.2)设计是很主观的事情，不是一步到位（重构）；b.3)不要为了用模式而用模式，往往代码的实用性和易读性更重要。
		//c)设计模式无用论
		//几千到几万行代码，不太需要用到设计模式。
		//10-20万行代码，就需要用到设计模式。
		//开发代码中，常常会无意识的用到某种设计模式，只是自己没注意到而已。

		//（4）设计模式的缺点
		//优点：灵活性，可复用性
		//a)增加程序书写的复杂性；
		//b)增加了学习和理解上的负担；——用户想要一杯茶，就不要为他创建一个能煮沸海洋的系统。
		//c)设计模式的引入会在一定程度上降低程序的运行效率。

		//（5）设计模式在实际工作中的应用和学习方法
		//a)日常工作中的小项目：用到设计模式的机会不多：项目规模偏小；项目的逻辑功能比较单一；也可能会无意中用到设计模式。
		//b)大型应用项目和框架类项目 :ACE框架：框架可以理解成多种设计模式的综合运用所生成的半成品。
		  //这里是设计模式发挥重要作用的舞台。
		//学习设计模式的步骤和方法：
		//a)掌握设计模式的基本概念和该设计模式要解决的具体问题。
		//b)动手实际编写相关的测试代码并进一步体验该模式的工作过程。一定不要略过这步。
		//c)编码过程中不断思考和总结设计经验，对于设计不合理的部分及时调整和更改。
		//d)在实际的项目中，细致大胆的采用设计模式进行实战，尤其注意多个设计模式解决问题时模式之间的关联和配合，不要怕出错。

		//（6）学习设计模式的态度、方法和课程的特点
		//（6.1）学习设计模式的态度、方法
		//软件开发中需求经常变更，或者增加新需求。设计模式能够发挥重要作用的场所往往就是软件开发中经常发生变化的场所。
		   //寻找和总结这种经常发生变化的场所，无疑考验着软件开发人员的能力和智慧，决定着开发人员对设计模式的运用程度。
		//理解设计模式的工作流程，看得懂该模式对应的源代码仅仅是其一，更重要的是是要理解在何时何地采用何种设计模式开展工作最合适。
		//（6.2）课程的特点
		//a)概念力求简单，出现生涩词汇，都会详细解释。
		//b)摆脱以往枯燥介绍设计模式的讲解方法，以实际游戏案例贯穿课程来件。
		//需要设计模式本身不是这门课程的主要目的，让大家学会在哪些场合下选择使用哪种设计模式才是这门课程的宗旨。
		//c)设计模式，独立于特定编程语言，但设计模式总归 要通过具体的编程语言来实现。
		//本门课程指的是 用C++语言来实现各种设计模式。






	return 0;
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件



/*
	设计模式，是一套被反复使用的代码设计经验的总结，是经过提炼的出色设计方法。
	设计模式，是程序员在长期的开发实践中总结出的一套提高开发效率与程序执行效率的编程方法。
	设计模式，代表了一些解决常见问题的通用做法，体现着人们尝试解决某些问题时的智慧。所以，它是一种强大的管理复杂度的工具。
	设计模式，是在特定问题发生时的可重用解决方案。
	一个设计模式用来描述几个模块或类对象之间关系、职责，以及它们之间如何进行分工与合作。一个甚至是几个设计模式共同配合来解决软件设计中面对的实际问题。
	设计模式在比编程语言惯用手法更高的层面来描述解决特定类型问题的途径。
	设计模式用来描述在软件系统中如何通过管理代码的相互依赖性来管理复杂性。
*/